package com.eric.controller;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/getInfo")
public class GetLoginInfo {
    @RequestMapping("/getid")
    public String getLoginId(){

        return StpUtil.getLoginId().toString();
    }

    @RequestMapping("/getTokenValue")
    public String  getTokenValue(){
        List<String> permissionList = StpUtil.getPermissionList();
//        System.out.println(permissionList);
        return StpUtil.getTokenValue();
    }
    @RequestMapping("/getTokenName")
    public String getTokenName(){
        return StpUtil.getTokenName();
    }

    //    获取当前登录用户的权限表
    @RequestMapping("/getPermissionList")
    public List<String>  getPermissionList(){
        return StpUtil.getPermissionList();
    }

    //    获取当前登录用户的角色表
    @RequestMapping("/getRoleList")
    public List<String> getRoleList(){
        return StpUtil.getRoleList();
    }

    //    获取token并返回到前端，用于无cookie方式
    @RequestMapping("/getToken")
    public SaResult getToken(){
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        return SaResult.data(tokenInfo);
    }

    //    下面两个方法是验证二级认证业务流程
    @RequestMapping("deleteProject")
    public SaResult deleteProject(String projectId){
        /*通过StpUtil.isSafe()方法，检查是否已经完成二级认证，具体实现
         * 不用管，反正是isSafe()方法是验证是否完成二级认证，返回一个布尔值就好了*/
        if (!StpUtil.isSafe()){
            return SaResult.error("仓库删除失败，请完成二级认证后再次访问接口");
        }
        return SaResult.ok("仓库删除成功");
    }

    @RequestMapping("opensafe")
    public SaResult openSafe(String password){
        if ("123".equals(password)){
            /* 一般if判断
            通过StpUtil.openSafe（）方法进行二次认证，里面的参数是个时间，单位是秒
            * 如果120，表示这个二级认证时间是120秒，超过时间，二级认证就失败
            * */
            StpUtil.openSafe(120);
            return SaResult.ok("二级认证成功");
        }
        return SaResult.error("二级认证失败");
    }

    @RequestMapping("getOtherAccount")
    public SaResult getOtherAccountInfo(){
        System.out.println("======tokenvalue=====");
//        获取指定账号的 tokenValue值
        String tokenValueByLoginId = StpUtil.getTokenValueByLoginId(2);
        System.out.println(tokenValueByLoginId);
//        StpUtil.logout(2);
        System.out.println("=====has session=====");
//        获取账号2的session对象，如果session尚未常见，则返回null，如果没有第二个参数，就新建并返回
        SaSession sessionByLoginId = StpUtil.getSessionByLoginId(2,false);
        System.out.println(sessionByLoginId);
        System.out.println("=========hasRole======");
//       获取账号1是否含有指定角色标识，返回布尔值
        boolean b = StpUtil.hasRole(1, "normal");
        System.out.println(b);
        System.out.println("======haspermission=====");
//        获取账号1是否含有指定权限吗，返回一个布尔值
        boolean b1 = StpUtil.hasPermission(1, "user.delete");
        System.out.println(b1);
        return SaResult.ok();
    }

    @RequestMapping("switchAccount")
    public SaResult switchAccount(){
//        把当前会话的身份切换为其它账号
        StpUtil.switchTo(2);
        String string = StpUtil.getLoginId().toString();
        System.out.println(string);
        System.out.println(StpUtil.getLoginDevice());
//        StpUtil.getLoginId();
//        StpUtil.endSwitch();
        return SaResult.ok();

    }


}
